package innerclass;


/**
 * 内部类示例
 * <p>
 * 1、内部类与外部类可以方便的访问彼此的私有域（包括私有方法、私有属性）。
 * 2、内部类是另外一种封装，对外部的其他类隐藏。
 * 3、内部类可以实现java的单继承局限。
 * <p/>
 *
 * @author <a href="mailto:sjj@jianzhimao.com">mojo</a>
 * copyright (C), 2013-2022, 广州九尾信息科技有限公司
 * @date 2022/11/22 10:58
 */
public class InnerClassDemo {
    public int f1 = 1;
    protected int f2 = 2;
    int f3 = 3;
    private int f4 = 4;
    static int f5 = 5;

    public InnerClassDemo() {
        System.out.println("创建 " + this.getClass().getSimpleName() + " 对象");
        NormalInnerClass innerClass = new NormalInnerClass();
        /**可访问内部类所有访问权限的属性*/
        System.out.println("field1>>>" + innerClass.field1);
        System.out.println("field2>>>" + innerClass.field2);
        System.out.println("field3>>>" + innerClass.field3);
        System.out.println("field4>>>" + innerClass.field4);
    }

    // 普通内部类
    public class NormalInnerClass {
        public String f1 = "sds";
        public int field1 = 5;
        protected int field2 = 6;
        int field3 = 7;
        private int field4 = 8;
        // 普通内部类不能定义静态变量
        // static int f5 = 9;

        // 普通内部类不能定义静态方法
        // public static void staticMethod() {
        // }
        public NormalInnerClass() {
            System.out.println("内部类创建 " + this.getClass().getSimpleName() + " 对象");
            System.out.println(">>>" + f1);
            System.out.println(">>>" + f2);
            System.out.println(">>>" + f3);
            System.out.println(">>>" + f4);
            System.out.println(">>>" + f5);
        }

        public void normalMethod() {
            System.out.println(f1);
            System.out.println(InnerClassDemo.this.f1);
            InnerClassDemo.this.m1();
        }
    }

    // 静态内部类
    public static class StaticInnerClass {
        public int field1 = 5;
        protected int field2 = 6;
        int field3 = 7;
        private int field4 = 8;
        static int field5 = 9;

        public StaticInnerClass() {
            System.out.println("内部类创建 " + this.getClass().getSimpleName() + " 对象");
            // 不能访问外部内非静态域
            // System.out.println(">>>" + f1);
            // System.out.println(">>>" + f2);
            // System.out.println(">>>" + f3);
            // System.out.println(">>>" + f4);
            System.out.println(">>>" + f5);
            // System.out.println("=============================================");
            // 不能使用匿名内部类的属性
            // System.out.println(">>>" + f66);
        }

        public void innerMethod() {
            //静态内部类不能直接调用外部非静态方法
            //InnerClassDemo.this.m1();
            InnerClassDemo.m2();
        }


    }

    // 匿名内部类
    interface AnonymousClass {
        int f66 = 66;

        // 匿名方法
        void anonymousMethod();
    }

    void anonymousMethodTest() {
        AnonymousClass anonymousClass = () -> {
            System.out.println(">>>" + f1);
            System.out.println(">>>" + f2);
            System.out.println(">>>" + f3);
            System.out.println(">>>" + f4);
            System.out.println(">>>" + f5);
            System.out.println(">>>" + new NormalInnerClass().field4);
            System.out.println(">>>" + StaticInnerClass.field5);
            System.out.println(">>>>匿名内部类方法实现");
        };
        anonymousClass.anonymousMethod();

    }

    //使用内部类继承其他类，达到一个类继承多个类的目的
    class InnerClassA extends ClassA {

    }

    class InnerClassB extends ClassB {

    }

    class InnerClassC extends ClassC {

    }

    public void m1() {
        System.out.println(">>>普通方法");

        // 方法内部类
        class MethodInnerClass {

        }
    }

    public static void m2() {
        System.out.println(">>>静态方法");
    }
}
